package com.hch.datastructure.linkedlist;

import org.apache.tomcat.util.http.parser.Upgrade;

import java.util.LinkedList;

public class SingleLinkedList {
    //先初始化一个头节点, 头节点不要动, 不存放具体的数据
    private SingleNode head = new SingleNode(0);

    //返回头节点
    public SingleNode getHead() {
        return head;
    }

    //添加节点到单向链表
    //思路，当不考虑编号顺序时
    //1. 找到当前链表的最后节点
    //2. 将最后这个节点的next 指向 新的节点
    public void add(SingleNode heroNode) {
        //因为head节点不能动，因此我们需要一个辅助遍历 temp
        SingleNode temp = head;
        //遍历链表，找到最后
        while (true) {
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //找到链表的最后
            if (temp.getNext() == null) {//
                break;
            }
            //如果没有找到最后, 将将temp后移
            temp = temp.getNext();
        }
        //当退出while循环时，temp就指向了链表的最后
        //将最后这个节点的next 指向 新的节点
        temp.setNext(heroNode);
    }

    public void addByOrder(SingleNode singleNode) {
        //因为头节点不能动，因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
        //因为单链表，因为我们找的temp 是位于 添加位置的前一个节点，否则插入不了
        SingleNode temp = head;
        if (singleNode.getSerialNum() <= 0) {
            throw new RuntimeException("请定义正确的序号");
        }
//        定义序号是否重复的标识
        boolean flag = false;
        while (true) {
//            链表结尾直接跳出当前循环
            if (temp.getNext() == null) {
                break;
            }
//            找到了相应位置
            if (temp.getNext().getSerialNum() > singleNode.getSerialNum()) {
                break;
            }
//           序号重复
            if (temp.getNext().getSerialNum() == singleNode.getSerialNum()) {
                flag = true;
                break;
            }
            temp = temp.getNext();
        }
        if (flag) {
            throw new RuntimeException("当前序号已经存在");
        }
//        插入到相应位置
        singleNode.setNext(temp.getNext());
        temp.setNext(singleNode);

    }

    public void update(SingleNode singleNode) {
        if (singleNode == null) {
            return;
        }
        SingleNode temp = head;


    }

    public void list() {
        if (head.getNext() == null) {
            System.out.println("链表为空");
            return;
        }

        SingleNode temp = head.getNext();

        while (true) {
//
            if (temp == null) {
                break;
            }
            //输出节点的信息
            System.out.println(temp);
            //将temp后移， 一定小心
            temp = temp.getNext();
        }
    }

    //    链表反转
    public SingleNode reverseList() {
//        无节点或者只有一个节点无需反转，，头节点不算
        if (head.getNext() == null || head.getNext().getNext() == null) {
            return head;
        }
//        建立一个虚拟节点进行操作
        SingleNode cur = head.getNext();
//建立一个虚拟头节点接收新的反转后的链表
        SingleNode reverse = new SingleNode(0, null);

//        遍历操作链表
        while (cur != null) {
//            先将后序链表保留后边有用
            SingleNode next = cur.getNext();
//            将cur的下一个节点指向新的链表的最前端
            cur.setNext(reverse.getNext());
//            将cur 连接到新的链表上
            reverse.setNext(cur);
//            让cur后移
            cur = next;

        }
        head.setNext(reverse.getNext());
        return head;
    }

}
